<?php
/**
 * @name HackInPain_Model_Abstract
 * @author François Guégnaud
 * @version 1.0-1
 */
abstract class HackInPain_Model_Abstract {
	
	/**
	 * Cette fonction est à déclarer dans le constructeur du fils par parent::__construct()
	 * @name __construct
	 * @param array $donnees
	 */
	public function __construct($donnees) {
		if(is_array($donnees)) {
			$this->setOptions($donnees);
		}
	}
	
	/**
	 * Hydratation d'un objet.
	 * Les setters utilisés sont (dans l'ordre de priorité) :
	 * 	- $this->setMon_attribut($Mon_attribut)
	 * 	- $this->__set($Mon_attribut)
	 * @name setOptions
	 * @param array $donnees
	 */
	public function setOptions(array $donnees){
		foreach($donnees as $key => $value) {
			$setter = 'set'.ucfirst($key);
			if(method_exists($this, $setter)) {
				$this->$setter($value);
			} else {
				$this->__set($key, $value);
			}
		}
	}
	
	/**
	 * Setter par défaut
	 * @param string $nom
	 * @param $valeur
	 * @throws Exception si la propriété n'existe pas
	 */
	public function __set($nom, $valeur) {
		$nom = '_'.$nom;
		if(property_exists($this, $nom)) {
			$this->$nom = $valeur;
		} else {
			self::notProperty($this, $nom);
		}
	}
	
	/**
	 * Getter par défaut
	 * Si la propriété existe, renvoi sa valeur.
	 * @throws Exception si la propriété n'existe pas
	 * @param $nom
	 */
	public function __get($nom) {
		$nom = '_'.$nom;
		if(property_exists($this, $nom)) {
			return $this->$nom;
		} else {
			self::notProperty($this, $nom);
		}
	}
	
	/**
	 * Renvoi une exception dans le cas d'une propriété inexistante
	 * @param $this
	 * @param $nom
	 */
	protected static function notProperty($this, $nom) {
		//throw new Exception("La propriété ".$nom." n'existe pas dans l'objet ".get_class($this));
	}
	
	/**
	 * Ajout des slashes sur les champs nécessitant cette protected pour les requêtes SQL
	 */
	public function sqlPrepare() {
		foreach(get_class_vars(get_class($this)) as $key) {
			$this->$key = addslashes($this->$key);
		}
	}

}